﻿// UTF8Code.h: interface for the UTF8Code class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_UTF8CODE_H__F809488D_F429_4C74_9E12_C542A923B174__INCLUDED_)
#define AFX_UTF8CODE_H__F809488D_F429_4C74_9E12_C542A923B174__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <string>

#ifdef WIN32
#include <AtlBase.h>
#include <AtlConv.h>
#endif

bool W2UTF8(const wchar_t* pInput_unicode,
				  char** ppOutput_utf8,
				  unsigned long* nLength);
bool UTF82W(const char* pInput_utf8,
				  wchar_t** ppOutput_unicode,
				  unsigned long *nLength);

const std::basic_string<char> W2UTF8(const wchar_t*);
const std::basic_string<wchar_t> UTF82W(const char*);

#ifndef WIN32

std::basic_string<wchar_t> CA2W_(const char *ansi);
std::string CW2A_(const wchar_t *unicode);

#ifdef __APPLE__
#define CT2W(x) x
#endif

/**
 * 把宽字节转成ANSI编码的单字节
 * 原理: 使用c标准wcstombs, 另外Android不支持这个方法
 */
#define CW2A(str) CW2A_(str).c_str()
#define CA2W(str) CA2W_(str).c_str()
#endif

#define CUTF8_TO_A(str) CW2A(UTF82W(str).c_str())
#define CUTF8_TO_W(str) UTF82W(str).c_str()
#ifdef WIN32
#define CUTF8_TO_T(str) CW2T(UTF82W(str).c_str())
#else
#define CUTF8_TO_T(str) CUTF8_TO_A(str)
#endif

#define CA_TO_UTF8(str) W2UTF8(CA2W(str)).c_str()
#define CW_TO_UTF8(str) W2UTF8(str).c_str()
#ifdef WIN32
#define CT_TO_UTF8(str) W2UTF8(CT2W(str)).c_str()
#else
#define CT_TO_UTF8(str) CA_TO_UTF8(str)
#endif

#endif // !defined(AFX_UTF8CODE_H__F809488D_F429_4C74_9E12_C542A923B174__INCLUDED_)
